/**
 * 访问修饰符
 * 1. public: 默认的          类自身、子类、类的外部可用
 * 2. protected： 受保护的    类自身、子类
 * 3. private: 私有的         类自身
 */
class Person{
    // 对属性进行声明
    public name:string
    protected age:number // 
    private money:number
    constructor(name:string,age:number,money:number){
        this.name = name;
        this.age = age;
        this.money = money;
    }
    intro():void{
        console.log('name: ', this.name);// 类自身name可用
        console.log('age: ', this.age);
        console.log('money: ', this.money);
    }
}
const p1 = new Person('atguigu', 19, 2000);
console.log('p1: ', p1);
// console.log('p1 money: ', p1.money); //属性“money”为私有属性，只能在类“Person”中访问
p1.intro();

// 2. 继承 

class Programmer extends Person{
    skill: string
    constructor(name:string, age:number, money:number, skill:string){
        // 运行父类的构造函数
        super(name, age, money);
        // 自己的新属性
        this.skill = skill
    }

    hello(){
        console.log('hello name: ', this.name);// 子类中使用
        console.log('hello age: ', this.age);

        // 测试私有属性
        // console.log('hello money: ', this.money);//属性“money”为私有属性，只能在类“Person”中访问
    }
}

let p2 = new Programmer('尚硅谷',19,3000, 'javascript')
console.log(p2);

p2.hello();

console.log(p2.name); // 类的外部使用

// console.log(p2.age); // 属性“age”受保护，只能在类“Person”及其子类中访问

export {}